#ifndef __INVOKE_INSTRUCTION_IMP_H
#define __INVOKE_INSTRUCTION_IMP_H

#include "InvokeInstruction.h"

class Command
{
public:
    virtual void Do(std::vector<std::string> &args) = 0;
};

void InitInvokeInstructionMap(std::shared_ptr<Command> &tuiCmd, std::shared_ptr<Command> &tuiBatchCmd);

class InvokeDemoCmd: public InvokeInstruction
{
private:
    /* data */
public:
    InvokeDemoCmd(/* args */);
    ~InvokeDemoCmd() = default;

    virtual void Execute(std::vector<std::string> &args);
};


class InvokeHelpCmd: public InvokeInstruction
{
private:
    /* data */
public:
    InvokeHelpCmd(/* args */);
    ~InvokeHelpCmd() = default;

    virtual void Execute(std::vector<std::string> &args);
};

class InvokeTUI: public InvokeInstruction
{
private:
    static std::shared_ptr<Command> cmd;
public:
    InvokeTUI(/* args */);
    ~InvokeTUI() = default;

    static void SetCommand(std::shared_ptr<Command> &cmd);

    virtual void Execute(std::vector<std::string> &args);
};

class InvokeTUIBatch: public InvokeInstruction
{
private:
    static std::shared_ptr<Command> cmd;
public:
    InvokeTUIBatch(/* args */);
    ~InvokeTUIBatch() = default;

    static void SetCommand(std::shared_ptr<Command> &cmd);

    virtual void Execute(std::vector<std::string> &args);
};

#endif